// 实例化Koa对象
const Koa = require('Koa')
const app = new Koa()

// 引用Koa中间件模块
const bodyparser = require('koa-bodyparser')
const json = require('koa-json')
const logger = require('koa-logger')
const error = require('koa-json-error')
const parameter = require('koa-parameter')
const koaJwt = require('koa-jwt')
// 引入自动化注册路由模块
const routes = require('./app/routes/index')
const { tokenSecret } = require('./app/utils/env')

// 中间件
app.use(error({
    // 在生产环境(云环境)中去掉错误信息中的堆栈信息。
    postFormat: (e, { 
        stack,
        ...rest
    }) => process.env.NODE_ENV === 'qcloud' ? rest : {
        stack,
        ...rest
    }
}))
app.use(bodyparser())
app.use(json())
app.use(logger())
app.use(parameter(app))

// 日志
app.use(async (ctx, next) => {
    const start = new Date()
    await next()
    const ms = new Date() - start
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})

// JWT错误处理与检验
app.use(function(ctx, next){
    return next().catch((err) => {
      if (401 == err.status) {
        ctx.status = 401
        ctx.body = {
            message : "JWT校验失败，请重新登陆",
            status : 401
        }
      } else {
        throw err
      }
    })
})

// 校验JWT令牌，仅/users/login此路径不做权限校验。
app.use(koaJwt({secret:tokenSecret}).unless({path:[/^\/users\/login/]}))

// 路由
routes(app)

// 将app实例对外暴露
module.exports = app